启动

1
2
> redis-server
> redis-cli -h 127.0.0.1 -p 6379

如果在启动的时候提示:Address already in use.意思你的6379端口被占用

找到这个进程,使用命令 ps -ef | grep -i redis

启动客户端

  • 默认启动
    使用命令redis-cli启动客户端,按照默认配置连接Redis(127.0.0.1:6379)。
  • 指定地址和端口号
    使用命令 
1
redis-cli      -h 127.0.0.1 -p 6379

Redis从入门到实践

花了一周左右,全面的学习redis的知识,并记录学习笔记]

盛赞redis

  • 高性能key-value服务器
  • 多种数据结构
  • 丰富的功能
  • 高可用的分布式支持

redis初识

定义

Redis是一个使用ANSI C编写的开源、支持网络、基于内存、可选持久性的键值对存储数据库

特性

  • 开源
  • 多种数据结构
  • 基于键值的存储服务系统
  • 高性能,功能服务

redis的前世今生

paste image

谁在使用redis

  • github
  • twitter
  • 微博
  • Stack Overflow
  • 阿里巴巴
  • 百度
  • 美团
  • 搜狐
  • ……

redis特性目录

  • 速度快
  • 持久化
  • 多种数据结构
  • 支持多种编程语言
  • 功能丰富
  • 简单:代码短小精悍
  • 主从复制
  • 高可用、分布式

特性1:速度快

10w QPS

原因

  • 数据存在内存
  • c语言编写
  • 单线程编写

paste image

paste image

特性2:持久化

  • redis所有的数据保存在内存中,对数据的更新将异步地保存到磁盘上

特性3:数据结构

paste image

特性4:多语言客户端

  • java
  • php
  • python
  • ruby
  • lua
  • nodejs

特性5:功能丰富

  • 发布订阅
  • lua脚本
  • 事务
  • pipeline

特性6:简单

  • 23000行代码实现核心功能
  • 不依赖外部库
  • 单线程模型

特性7:复制

paste image

特性8: 高可用

  • redis-sentinel支持高可用
  • 分布式 redis-cluster支持分布式

redis典型使用场景

  • 缓存系统

paste image

  • 计数器

paste image

  • 消息队列系统

paste image

  • 排行榜

paste image

  • 社交网络
  • 实时系统

Redis特性

1.速度快

  • 官方称可以达到10W的qps
  • 将数据存储在内存中
  • 由C语言编写
  • 线程模型为单线程

2.持久化

  • Redis将所有数据保持在内存中,并异步更新到磁盘上

3.支持多种数据结构

  • String
  • Hash
  • List
  • Set
  • ZSet
  • BitMap(位图)
  • HyperLogLog(超小的内存唯一值计数器)
  • GEO(地理信息定位)

4.支持多种编程语言

  • Java
  • Python
  • Ruby
  • Lua
  • NodeJS

5.功能丰富

  • 支持类MQ的发布订阅功能
  • 支持Lua脚本
  • 支持事务
  • 支持pipeline

6.非常简单

  • Redis 3.0的单机核心代码只有2300行代码
  • 单线程模型

7.支持主从复制

8.高可用、分布式

  • 在 V2.8 中支持Redis Sentinel
  • 在 V3.0 中支持Redis Cluster

reids三种启动方法

  • 最简启动(采用默认配置文件启动)
1
2
redis-server
复制代码

验证

1
2
3
4
ps aux | grep redis
复制代码
redis-cli -h 127.0.0.1 -p 6379 ping
复制代码
  • 配置文件启动 (将需要配置的参数写入文件)
1
2
redis-server configPath
复制代码
  • 动态参数启动
1
2
redis-server --port 6380
复制代码

三种启动方式比较

  • 生产环境选择配置启动
  • 单机多实例配置文件可以用端口区分开

redis客户端连接

1
2
redis-cli -h 127.0.0.1 -p 6379
复制代码

redis客户端返回值

返回值 返回值说明
状态回复 ping -> pong
错误回复 hget hello field -> (error) ERR wrong number of arguments for ‘hget’ command
整数回复 incr hello -> (integer) 1
字符串回复 get hello -> “1”
多行字符串回复 mget hello foo -> 1) “1” 2) (nil)

redis常用配置

配置名 说明
daemonize 是否是守护进程(no/yes)
port redis对外端口号
logfile redis系统日志
dir redis工作目录

redis安装启动(配置文件方式)

配置方式

  • 配置文件
1
2
3
4
5
6
7
vim redis-6382.conf

port 6382
daemonize yes
logfile "6382.log"
dir ./workdata/
复制代码
  • 启动
1
2
redis-server redis-6382.conf 
复制代码
  • 检查
1
2
ps -aux | grep -v redis-server | grep 6382 
复制代码
  • 日志文件
1
2
vim workdata/6382.log
复制

Redis启动方式

1.最简启动:使用默认配置

  • ./redis-server

2.动态参数启动

./redis-server –port 6379

3.指定配置文件启动

./redis-server configPath

生产环境推荐此方式:单机多实例配置





Redis基础常用配置

1.daemonize

​ 是否是守护进程(yes/no),设置为yes时,Redis会把启动日志输出到日志文件中

2.port

​ Redis端口号

3.logfile

​ log 输出到标准设备,logs 不写文件,输出到空设备,/deb/null

4.dir

​ 数据库存放路径

Redis数据结构与内部编码

  • string :raw , int , embstr
    • int的范围相当于Java中的long,为8个字节长整型
    • 字符长度少于等于39个长度时为embstr
    • 字符长度超过39个长度时为raw,比起embstr,是不连续的
  • hash :hashtable(哈希表) , ziplist(压缩列表)
    • hash-max-ziplist-entries 512
    • hash-max-ziplist-value 64
    • 当hash结构的field数量小于等于512并且每个field与value的长度小于等于64时,hash会采用ziplist
  • list :linkedlist(双向循环链表) , ziplist(压缩列表)
    • list-max-ziplist-entries 512
    • list-max-ziplist-value 64
    • 当list结构的元素数量小于等于512并且每个item的长度小于等于64时,list会采用ziplist
  • set :hashtable(哈希表) , intset(整数集合)
    • set-max-intset-entries 512
    • 当set结构的元素数量小于等于512时候,set将采用intset
  • zset :skiplist(跳跃列表) , ziplist(压缩列表)
    • zset-max-ziplist-entries 512
    • zset-max-ziplist-value 64
    • 当zset结构的元素数量小于等于512并且每个member的长度小于等于64时,zset会采用ziplist
  • 当key的数量比较少时,Redis采取以时间换空间的策略
  • 当key的数量增多时,Redis采取以空间换时间的策略
  • 查看内部编码的方式 object encoding ${key}
  • ziplist的特点
    • 连续内存
    • 读写有指针位移,最坏O(n2)
    • 新增删除有内存重分配

Redis单线程为什么速度还那么快

  • 纯内存
  • 使用epoll创建非阻塞IO
  • 由于是单线程,因此避免了线程切换和竞态消耗

Redis单线程需要注意的点

  • 一次只会运行一条命令
  • 拒绝长命令/慢命令
    • keys
    • flushall
    • flushdb
    • slow lua script
    • mutil/exec
    • operate

Redis配置生效方法

  • 修改config配置文件,然后重启redis服务
  • config set configName configValue (前提需要当前配置支持动态配置)